package hot

import "sort"

/*
https://leetcode.cn/problems/group-anagrams/description/?envType=study-plan-v2&envId=top-100-liked

49. 字母异位词分组
中等
给你一个字符串数组，请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:
输入: strs = [""]
输出: [[""]]

示例 3:
输入: strs = ["a"]
输出: [["a"]]
*/
func groupAnagrams(strs []string) [][]string {

	m := map[string][]string{}

	for _, str := range strs {
		byteArr := []byte(str)
		sort.Slice(byteArr, func(i, j int) bool { return byteArr[i] < byteArr[j] }) //升序排序当前字符串
		sortedStr := string(byteArr)                                                //转为排序好的字符串
		m[sortedStr] = append(m[sortedStr], str)                                    //排序好的字符串, 对应的val值为字符串数组, 该字符串数组添加当前字符串
	}

	//创建结果数组
	res := make([][]string, 0, len(m))
	for _, v := range m { //遍历map, 将map中的所有子数组, 添加到结果数组中
		res = append(res, v)
	}
	return res
}
